package com.edu.exam.entity.curriculum.course;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import java.time.LocalDateTime;

/**
 * 课程扩展属性实体
 * 所属模块：B-01 课程管理模块
 * 对应设计文档：B-01-01-06-数据库设计.md
 *
 * 采用简化的键值对存储方式，不包含复杂的模板系统。
 * 不包含业务逻辑代码，仅包含数据字段和JPA注解。
 *
 * @author System
 * @version 1.0.0
 */
@Entity
@Comment("课程扩展属性表")
@Table(name = "course_attributes")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CourseAttribute {

    /**
     * 属性ID，主键
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    /**
     * 课程ID，外键关联课程表
     */
    @NotNull(message = "课程ID不能为空")
    @Column(name = "course_id", nullable = false)
    private Long courseId;

    /**
     * 属性键，用于标识属性
     */
    @NotBlank(message = "属性键不能为空")
    @Size(max = 50, message = "属性键长度不能超过50个字符")
    @Column(name = "attribute_key", nullable = false, length = 50)
    private String attributeKey;

    /**
     * 属性值，存储属性值
     */
    @Column(name = "attribute_value", columnDefinition = "TEXT")
    private String attributeValue;

    /**
     * 属性类型，枚举类型（文本、数字、日期、布尔），简化类型管理
     */
    @NotNull(message = "属性类型不能为空")
    @Enumerated(EnumType.STRING)
    @Column(name = "attribute_type", nullable = false, length = 20)
    private AttributeType attributeType;

    /**
     * 是否必填，标识该属性是否为必填项
     */
    @Column(name = "is_required")
    @Builder.Default
    private Boolean isRequired = false;

    /**
     * 是否启用，控制属性的显示和使用，默认值为启用状态
     */
    @Column(name = "is_enabled")
    @Builder.Default
    private Boolean isEnabled = true;

    /**
     * 排序序号，用于属性排序显示，默认值为0
     */
    @Column(name = "sort_order")
    @Builder.Default
    private Integer sortOrder = 0;

    /**
     * 创建时间
     */
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 属性类型枚举
     * 对应设计文档
     */
    public enum AttributeType {
        /**
         * 文本类型属性
         */
        TEXT("TEXT", "文本"),

        /**
         * 数值类型属性
         */
        NUMBER("NUMBER", "数字"),

        /**
         * 日期类型属性
         */
        DATE("DATE", "日期"),

        /**
         * 布尔类型属性
         */
        BOOLEAN("BOOLEAN", "布尔");

        private final String code;
        private final String description;

        AttributeType(String code, String description) {
            this.code = code;
            this.description = description;
        }

        public String getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }
    }
}
